/*
 * 系统项目名称：综合决策分析系统
 * 文件名：AnalysisService.java
 * 描述：
 * 版权：Copyright 2015-2020 义乌市跨境电商供应链管理有限公司-版权所有
 * 修改人：xushaobing
 * 修改时间：2015年10月29日 下午2:30:50
 * 版本号：V1.1
 */
package com.ywt.cda.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import com.ywt.cda.domain.Ana3rdData;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.ywt.cda.core.dao.page.Page;
import com.ywt.cda.dao.Ana1stDataDao;
import com.ywt.cda.dao.Ana2ndDataDao;
import com.ywt.cda.dao.Ana3rdDataDao;
import com.ywt.cda.dao.AnaImportDataDao;
import com.ywt.cda.domain.Ana1stData;
import com.ywt.cda.domain.Ana2ndData;
import com.ywt.cda.domain.AnaImportData;
import com.ywt.cda.domain.enums.AnaTable;
import com.ywt.cda.domain.enums.DimensionFlag;
import com.ywt.cda.domain.enums.ParamFlag;

/**
 * （一句话功能简述） <br>
 * （功能详细描述）
 * 
 * @author 徐韶兵
 * @version V1.0
 * @see [相关类/方法]
 * @since 2015年10月29日 下午2:30:50
 */
@Component("govAnalysisService")
public class GovAnalysisService {
	// /**
	// * 日志读取器
	// */
	private static final Logger logger = Logger
			.getLogger(GovAnalysisService.class);
	/**
	 * 一维数据查询器
	 */
	@Resource
	private Ana1stDataDao ana1stDataDao;
	/**
	 * 二维数据查询器
	 */
	@Resource
	private Ana2ndDataDao ana2ndDataDao;
	@Resource
	private AnaImportDataDao anaImportDataDao;
	@Resource
	private Ana2ndDataService ana2ndDataService;
	/**
	 * 三维数据查询器
	 */
	@Resource
	private Ana3rdDataDao ana3rdDataDao;

	/**
	 * 获取某一天的统计二维统计排名数据 queryDayTopN(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param dateFlag
	 *            日期
	 * @param topN
	 *            排名最高位数
	 * @param mainFlagList
	 *            维度
	 * @return 二维统计排名数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:38
	 * @author 徐韶兵
	 */
	public Map<DimensionFlag, List<Ana2ndData>> queryDayTopNData(
			String dateFlag, int topN, String orderBy,
			DimensionFlag... mainFlagList) {
		Map<DimensionFlag, List<Ana2ndData>> result = new HashMap<DimensionFlag, List<Ana2ndData>>();
		for (int i = 0; i < mainFlagList.length; i++) {
			DimensionFlag mainFlag = mainFlagList[i];
			Map<String, Object> params = getParams(
					AnaTable.TB_ANA_DATA_2ND_GOV_D, mainFlag, dateFlag, orderBy);
			List<Ana2ndData> dataList = getAna2ndData(params, topN);
			result.put(mainFlag, dataList);
		}
		return result;
	}
	public Map<DimensionFlag, List<Ana2ndData>> queryTopNDataWithPort(
			String startDate,String endDate, int topN, String orderBy,boolean isCity,AnaTable table,
			DimensionFlag... mainFlagList) {
		Map<DimensionFlag, List<Ana2ndData>> result = new HashMap<DimensionFlag, List<Ana2ndData>>();
		for (int i = 0; i < mainFlagList.length; i++) {
			DimensionFlag mainFlag = mainFlagList[i];
			Map<String, Object> params = getParamsWithPort(
					table, mainFlag, startDate,endDate, orderBy,isCity);
			List<Ana2ndData> dataList = getAna2ndDataWithPort(params, topN);
			result.put(mainFlag, dataList);
		}
		return result;
	}
	public Map<DimensionFlag, List<Ana2ndData>> queryMonthTopNData(
			String dateFlag, int topN, String orderBy,
			DimensionFlag... mainFlagList) {
		Map<DimensionFlag, List<Ana2ndData>> result = new HashMap<DimensionFlag, List<Ana2ndData>>();
		for (int i = 0; i < mainFlagList.length; i++) {
			DimensionFlag mainFlag = mainFlagList[i];
			Map<String, Object> params = getParams(
					AnaTable.TB_ANA_DATA_2ND_GOV_M, mainFlag, dateFlag, orderBy);
			List<Ana2ndData> dataList = getAna2ndData(params, topN);
			result.put(mainFlag, dataList);
		}
		return result;
	}
	/**
	 * 获取某一年的统计二维统计排名数据 queryDayTopN(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param dateFlag
	 *            日期
	 * @param topN
	 *            排名最高位数
	 * @param mainFlagList
	 *            维度
	 * @return 二维统计排名数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:38
	 * @author 徐韶兵
	 */
	public Map<DimensionFlag, List<Ana2ndData>> queryYearTopNData(
			String dateFlag, int topN, String orderBy,
			DimensionFlag... mainFlagList) {
		Map<DimensionFlag, List<Ana2ndData>> result = new HashMap<DimensionFlag, List<Ana2ndData>>();
		for (int i = 0; i < mainFlagList.length; i++) {
			DimensionFlag mainFlag = mainFlagList[i];
			Map<String, Object> params = getParams(
					AnaTable.TB_ANA_DATA_2ND_GOV_Y, mainFlag, dateFlag, orderBy);
			List<Ana2ndData> dataList = getAna2ndData(params, topN);
			result.put(mainFlag, dataList);
		}
		return result;
	}

	/**
	 * 获取某一年的统计二维统计排名数据 queryDayTopN(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param startTime
	 *            开始日期
	 * @param endTime
	 *            结束日期
	 * @param topN
	 *            排名最高位数
	 * @param mainFlagList
	 *            维度
	 * @return 二维统计排名数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:38
	 * @author 徐韶兵
	 */
	public Map<DimensionFlag, List<Ana2ndData>> queryTopNData(String startTime,
			String endTime, int topN, String orderBy,
			DimensionFlag... mainFlagList) {
		Map<DimensionFlag, List<Ana2ndData>> result = new HashMap<DimensionFlag, List<Ana2ndData>>();
		for (int i = 0; i < mainFlagList.length; i++) {
			DimensionFlag mainFlag = mainFlagList[i];
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("startTime", startTime);
			params.put("endTime", endTime);
			params.put("tableName",
					AnaTable.TB_ANA_DATA_2ND_GOV_Y.getTableName());
			params.put("mainFlag", mainFlag.getCode());
			params.put("orderBy", orderBy);
			setParams(mainFlag, params);
			List<Ana2ndData> dataList = getAna2ndTotalData(params, topN);
			result.put(mainFlag, dataList);
		}
		return result;
	}

	/**
	 * 查询二维统计数据
	 * 
	 * @param params
	 *            查询参数
	 * @param topN
	 *            排名
	 * @return 二维统计数据
	 * @exception
	 * @since 2015年11月4日 上午12:01:26
	 * @author 徐韶兵
	 */
	private List<Ana2ndData> getAna2ndData(Map<String, Object> params, int topN) {
		List<Ana2ndData> dataList = null;
		// 为0，则不排名，查询所有数据
		if (0 == topN) {
			dataList = ana2ndDataDao.list(params);
		}
		// 不为0，查询排名数据
		else {
			dataList = ana2ndDataDao.list(params, new Page(1, topN));
		}
		return dataList;
	}
	private List<Ana2ndData> getAna2ndDataWithPort(Map<String, Object> params, int topN) {
		List<Ana2ndData> dataList = null;
		// 为0，则不排名，查询所有数据
		if (0 == topN) {
			dataList = ana2ndDataDao.listOrderBy(params,null);
		}
		// 不为0，查询排名数据
		else {
			dataList = ana2ndDataDao.listOrderBy(params, new Page(1, topN));
		}
		return dataList;
	}
	/**
	 * 查询二维统计数据
	 * 
	 * @param params
	 *            查询参数
	 * @param topN
	 *            排名
	 * @return 二维统计数据
	 * @exception
	 * @since 2015年11月4日 上午12:01:26
	 * @author 徐韶兵
	 */
	private List<Ana2ndData> getAna2ndTotalData(Map<String, Object> params,
			int topN) {
		List<Ana2ndData> dataList = null;
		if (null != params) {
			String mainFlag = (String) params.get("mainFlag");
			if (DimensionFlag.M_CATEGORY.getCode().equals(mainFlag)
					|| DimensionFlag.S_CATEGORY.getCode().equals(mainFlag)) {
				
				// 为0，则不排名，查询所有数据
				if (0 == topN) {
					dataList = ana2ndDataService.totalCategory(params,null);
				}
				// 不为0，查询排名数据
				else {
					dataList = ana2ndDataService.totalCategory(params, new Page(1, topN));
				}
				
			}
			else {

				// 为0，则不排名，查询所有数据
				if (0 == topN) {
					dataList = ana2ndDataService.total(params,null);
				}
				// 不为0，查询排名数据
				else {
					dataList = ana2ndDataService.total(params, new Page(1, topN));
				}
			}

		}
		else {

			// 为0，则不排名，查询所有数据
			if (0 == topN) {
				dataList = ana2ndDataService.total(params,null);
			}
			// 不为0，查询排名数据
			else {
				dataList = ana2ndDataService.total(params, new Page(1, topN));
			}
		}

		return dataList;
	}

	/**
	 * 设置参数对象
	 * 
	 * @param table
	 *            表名
	 * @param mainFlag
	 *            主维度
	 * @param dateFlag
	 *            查询时间
	 * @return 参数对象
	 * @exception
	 * @since 2015年11月4日 上午12:00:48
	 * @author 徐韶兵
	 */
	private Map<String, Object> getParams(AnaTable table,
			DimensionFlag mainFlag, String dateFlag, String orderBy) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("dateFlag", dateFlag);
		params.put("tableName", table.getTableName());
		params.put("mainFlag", mainFlag.getCode());
		params.put("orderBy", orderBy);
		setParams(mainFlag, params);
		return params;
	}
	private Map<String, Object> getParamsWithPort(AnaTable table,
			DimensionFlag mainFlag, String startDate,String endDate, String orderBy,boolean isCity) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("startDate", startDate);
		params.put("endDate", endDate);
		params.put("tableName", table.getTableName());
		params.put("mainFlag", mainFlag.getCode());
		params.put("orderBy", orderBy);
		params.put("isCity", isCity);
		setParams(mainFlag, params);
		return params;
	}

	/**
	 * 设置查询参数 <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param mainFlag
	 *            主维度
	 * @param params
	 *            参数Map
	 * @exception
	 * @since 2015年11月3日 下午11:59:10
	 * @author 徐韶兵
	 */
	private void setParams(DimensionFlag mainFlag, Map<String, Object> params) {
		switch (mainFlag) {
		// 商品品类
		case GOODS_TYPE:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_GOODS);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			break;
		// 出口国家
		case EXPORT_COUNTRY:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_COUNTRY);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			break;
		case GEP_COUNTRY:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_COUNTRY);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			break;
		// 物流方式
		case LOGIS_TYPE:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_PARAM);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			params.put("flag", ParamFlag.LOGIS_TYPE.getFlag());
			break;
		case LOGIS_COMPANY:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_PARAM);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			params.put("flag", ParamFlag.LOGIS_COMPANY.getFlag());
			break;
		// 电商企业
		case SHOPS_COMPANY:
			params.put("joinTableName", AnaTable.TB_CONF_DATA_PARAM);
			params.put("condition", " A.MAIN_CODE = B.CODE ");
			params.put("flag", ParamFlag.SHOP_COMPANY.getFlag());
			break;
		case EXPORT_PORT:
			if(params.containsKey("isCity") && (boolean)params.get("isCity")){
				params.put("joinTableName", AnaTable.TB_CONF_DATA_AREA);
				params.put("condition", " A.MAIN_CODE = B.PORT_CODE ");
			}else{
				params.put("joinTableName", AnaTable.TB_CONF_DATA_PARAM);
				params.put("condition", " A.MAIN_CODE = B.CODE ");
				params.put("flag", ParamFlag.PORT_CODE.getFlag());
			}
			

			break;
		
		default:
			break;
		}
	}

	/**
	 * 获取某一年的统计数据 queryYearData(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param dateFlag
	 *            年份
	 * @return 某一年的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:20
	 * @author 徐韶兵
	 */
	public Ana1stData queryYearData(String dateFlag) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("dateFlag", dateFlag);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_Y.getTableName());
		List<Ana1stData> dataList = ana1stDataDao.list(params);
		if (null == dataList || dataList.isEmpty()) {
			return null;
		}
		return dataList.get(0);
	}

	/**
	 * 获取某一年的统计数据 queryYearData(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param startDate
	 *            统计开始时间
	 * @param startDate
	 *            统计结束时间
	 * @return 某一年的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:20
	 * @author 徐韶兵
	 */
	public Ana1stData queryTotalData(String startDate, String endDate) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("startDate", startDate);
		params.put("endDate", endDate);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_Y.getTableName());
		return ana1stDataDao.total(params);
	}

	/**
	 * 获取某一月的统计数据 queryYearData(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param dateFlag
	 *            月份
	 * @return 某一月的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:20
	 * @author 徐韶兵
	 */
	public Ana1stData queryMonthData(String dateFlag) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("dateFlag", dateFlag);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_M.getTableName());
		List<Ana1stData> dataList = ana1stDataDao.list(params);
		if (null == dataList || dataList.isEmpty()) {
			return null;
		}
		return dataList.get(0);
	}

	/**
	 * 获取某一天的统计数据 queryYearData(这里用一句话描述这个方法的作用) <br>
	 * (这里描述这个方法适用条件 – 可选)
	 * 
	 * @param dateFlag
	 *            日期
	 * @return 某一天的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:51:20
	 * @author 徐韶兵
	 */
	public Ana1stData queryDayData(String dateFlag) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("dateFlag", dateFlag);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_D.getTableName());
		List<Ana1stData> dataList = ana1stDataDao.list(params);
		if (null == dataList || dataList.isEmpty()) {
			return null;
		}
		return dataList.get(0);
	}

	/**
	 * 查询近些天的数据统计
	 * 
	 * @param dateFlag
	 *            指定日期
	 * @param recentlyDay
	 *            往后推几天
	 * @return 近几天的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:58:48
	 * @author 徐韶兵
	 */
	public List<Ana1stData> queryDayRecentlyData(String startDate,
			String endDate) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_D.getTableName());
		return ana1stDataDao.list(params);
	}

	/**
	 * 查询近些月的数据统计
	 * 
	 * @param dateFlag
	 *            指定月
	 * @param recentlyDay
	 *            往后推几月
	 * @return 近几月的统计数据
	 * @exception
	 * @since 2015年10月29日 下午2:58:48
	 * @author 徐韶兵
	 */
	public List<Ana1stData> queryMonthRecentlyData(String startDate,
			String endDate) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		params.put("tableName", AnaTable.TB_ANA_DATA_1ST_GOV_M.getTableName());
		return ana1stDataDao.list(params);
	}
	
	public List<Ana2ndData> queryMonthRecentlyData(String startDate,String endDate,AnaTable table,String mainCode,DimensionFlag flag){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		
		params.put("tableName", table.getTableName());
		params.put("mainCode", mainCode);
		params.put("mainFlag", flag.getCode());
		
		return ana2ndDataDao.listByParams(params);
		
	}
	public List<Ana2ndData> queryTotalData(String startDate,String endDate,AnaTable table,String mainCode,DimensionFlag flag){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		
		params.put("tableName", table.getTableName());
		params.put("mainCode", mainCode);
		params.put("mainFlag", flag.getCode());
		
		return ana2ndDataDao.listTotalDataByParams(params);
		
	}
	public List<Ana2ndData> queryTotalDataWithPage(String startDate,String endDate,AnaTable table,String mainCode,String flag,String orderBy,String groupBy,Page page){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		
		params.put("tableName", table.getTableName());
		params.put("mainCode", mainCode);
		params.put("mainFlag", flag);
		params.put("groupCode", groupBy);
		params.put("orderBy", orderBy);
		return ana2ndDataDao.listTotalDataByParamsAndPage(params,page);
		
	}

	public List<Ana2ndData> getMcategoryByDateFlag(String startDate, String endDate){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		return ana2ndDataDao.getMcategoryByDateFlag(params);
	}

	public List<Ana3rdData> getGoodsMData(String startDate){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("startDate", startDate);
		return ana3rdDataDao.getGoodsMData(params);
	}
	public List<AnaImportData> queryTotalImportDataWithPage(String startDate,String endDate,AnaTable table,String mainCode,String flag,String orderBy,String groupBy,Page page){
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("endDate", endDate);
		params.put("startDate", startDate);
		
		params.put("tableName", table.getTableName());
		params.put("dimensionCode", mainCode);
		params.put("dimensionFlag", flag);
		params.put("groupCode", groupBy);
		params.put("orderBy", orderBy);
		return anaImportDataDao.listTotalDataByParamsAndPage(params,page);
		
	}

	public List<Ana3rdData> getTBandHB(Map<String, Object> params) {
		return ana3rdDataDao.getTBandHB(params);
	}
}
